#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

int cnt=0;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

void* Count(void* args)         //线程编号
{
    pthread_detach(pthread_self());
    uint64_t num=(uint64_t)args;
    cout<<"pthread: "<<num<<",create success"<<endl;
    while(1)
    {
        //如何知道要让一个线程去休眠？当临界资源不就绪时
        //如何知道临界资源是否就绪？判断是否访问临界资源，判断本身就是访问临界资源，判断必须在加锁之后
        //先加锁后判断

        //若没有申请到锁就去队列进行等待
        pthread_mutex_lock(&mutex);

        pthread_cond_wait(&cond,&mutex);        //等待队列是自动释放锁的
        cout<<"pthread: "<<num<<", cnt:"<<cnt++<<endl;

        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    for(uint64_t i=0;i<5;i++)
    {
        pthread_t tid;
        pthread_create(&tid,nullptr,Count,(void*)i);            //让i拷贝式传给函数，而不是传地址并发执行
        usleep(1000);                 //按顺序创建出线程
    }

    //执行线程
    sleep(3);
    cout<<"main thread ctrl begin"<<endl;
    while (1)
    {
        sleep(1);
        //pthread_cond_signal(&cond);     //唤醒等待队列中的第一个线程
        pthread_cond_broadcast(&cond);  //唤醒所有线程

        cout<<"signal one thread..."<<endl;
    }
    return 0;
}
